package com.piper.long_connection.pb_model.core.codc;

import com.piper.long_connection.pb_model.core.model.Request;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 数据包格式
 * <pre>
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——-----——+——-----——+
 * |  包头	|  模块号   |  命令号    |   长度     |   数据     |
 * +——----——+——-----——+——----——+——----——+——-----——+——-----——+
 * </pre>
 * 包头4字节
 * 模块号2字节
 * 命令号2字节
 * 长度4字节(数据部分占有字节数量)
 */
public class RequestEncoder extends MessageToByteEncoder<Request> {

    @Override
    protected void encode(ChannelHandlerContext ctx, Request msg, ByteBuf out) throws Exception {
        if (msg == null) {
            throw new Exception("The nettyMessage is null.");
        }

        //包头
        out.writeInt(ConstantValue.HEADER_FLAG);
        //module
        out.writeShort(msg.getModule());
        //cmd
        out.writeShort(msg.getCmd());
        //长度
        int lenth = msg.getData() == null ? 0 : msg.getData().length;
        if (lenth <= 0) {
            out.writeInt(lenth);
        } else {
            out.writeInt(lenth);
            out.writeBytes(msg.getData());
        }
    }
}
